/********************************************************************************************************************************
 * 《C ++ Primer》第五版中文版，读书笔记：按照书中的的示例源码和每一个小章节的课后习题，自己动手写代码实现，作为联系和测试。
 * Date: 2024-03-31 21:39
 * Author: dimon.chen 
 * EMali: 1181302388@qq.com 
 * 
 * 章节: 第三章 字符串，向量和数组
 *       3.3.1 定义和初始化vector对象
 * 
 ********************************************************************************************************************************/

#include <iostream>
#include <string>
#include <vector>

using std::string;

int main(int argc, char *argv[])
{
    ///
    /// 3.3.1节练习
    /// 练习3.12: 下列vector对象的定义有不正确的么？如果有，请指出来。
    /// 对于正确的请描述其执行结果，对于不正确的，说明错位原因
    ///

    //a
    //正确：定义的vector对象 ivec中的元素的类型是 vector<int> 对象
    //执行默认初始化，生成一个空的 ivec 对象
    std::vector<std::vector<int>> ivec;

    //b
    //错误：使用拷贝初始化，使用一个vector对象去初始化另一个对象
    //     vector中元素的类型必须相同
    //     svec中元素的类型是标准库类型 std::string
    //     ivec中元素的类型是vector<int>
    //std::vector<string> svec = ivec;

    //c
    // 正确，svec对象中元素的类型是 std::string
    //       虽然使用的是花括号来提供初始值，但因为 10 是 int 型，不能作为string对象
    //       所以编译器尝试使用直接初始化
    //       等价于 vector<string> svec(10, "null")
    //       vector对象中有10个元素，每个元素的值都是"null"字符串
    std::vector<string> svec2{10, "null"};



    ///
    /// 3.3.1节练习
    /// 练习3.13: 下列vector对象的包含有多少元素？这些元素的值分别是多少？
    ///

    //执行默认初始化，生成一个空的vector对象
    //vector对象 v1中元素的个数为0
    std::vector<int> v1;

    //vector 对象v2中元素的类型为 int 型
    // v2中有10个元素，执行值初始化，对于内置数据类型值初始化为0
    // v2中有10个0
    std::vector<int> v2(10);

    //vector对象v3中有10个元素，每个元素的值相同都是42
    //v3中元素的类型是 int 型
    std::vector<int> v3(10, 42);

    //vector对象v4，存储的元素的类型是int型
    // v4执行列表初始化，v4中有一个元素，值为4
    std::vector<int> v4{4};


    //vector对象v5执行列表初始化
    // v5中有两个元素，第一个元素的值为10，另一个元素的值为42
    std::vector<int> v5 {10, 42};

    //vector对象v6中元素的类型是标准库类型 string 
    //虽然使用花括号提供了一个初始值，但因为初始值是10 是一个int型，不能用于列表初始化string对象
    //所以编译器尝试把10作为构造 vector 对象的，
    //等价于 std::vector<string> v6(10); 
    // 执行值初始化，v6中有10个元素，元素的值为strig默认初始化为空string对象
    std::vector<string> v6{10};

    //等级与 std::vector<string> v7 (10, "hi")

    std::vector<string> v7 {10, "hi"};

    using std::vector;
    vector<string> v8    (10, "hi");


    //范围for(range-for)
    for(auto v : v8)
        std::cout << v << std::endl;
}